/**
 * Copyright &copy; 2013-2015 山东易科德软件有限公司 All rights reserved.
 */
package cn.net.ecode.modules.sys.entity;

import java.util.List;

import org.hibernate.validator.constraints.Length;

import cn.net.ecode.common.config.Global;
import cn.net.ecode.common.persistence.TreeEntity;
import cn.net.ecode.common.persistence.annotation.Id;
import cn.net.ecode.common.security.Digests;
import cn.net.ecode.common.utils.DateUtils;
import cn.net.ecode.common.utils.StringUtils;
import cn.net.ecode.common.web.Servlets;
import cn.net.ecode.modules.sys.utils.UserUtils;

import com.google.common.collect.Lists;

/**
 * 菜单管理Entity
 * 
 * @author ThinkGem
 * @version 2014-8-19
 */
public class Menu extends TreeEntity<Menu> {

	private static final long serialVersionUID = 1L;
	private String menuCode; 	// 菜单编码
	private String name; 		// 菜单名称
	private String moduleCode; 	// 归属模块
	private String type; 		// 类型（1菜单；2权限）
	private String href; 		// 链接
	private String target; 		// 目标（ addTab、_blank、_self、_parent、_top）
	private String color; 		// 颜色
	private String icon; 		// 图标
	private String isShow; 		// 是否在菜单中显示（1：显示；0：不显示）
	private String permission; 	// 权限标识

	private String roleCode;	// 角色编码
	private String userCode;	// 用户编码

	// 菜单类型（1菜单；2权限）
	public static final String TYPE_DEVMENU = "0";
	public static final String TYPE_MENU = "1";
	public static final String TYPE_PERM = "2";
	
	public Menu() {
		super();
		this.sorts = 30;
		this.type = Menu.TYPE_MENU;
		this.isShow = Global.SHOW;
	}

	public Menu(String id) {
		super(id);
	}

	public Menu getParent() {
		return parent;
	}

	public void setParent(Menu parent) {
		this.parent = parent;
	}
	
	@Id
	public String getMenuCode() {
		return menuCode;
	}

	public void setMenuCode(String menuCode) {
		this.menuCode = menuCode;
	}

	@Length(min = 1, max = 100)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Length(min = 0, max = 2000)
	public String getHref() {
		return href;
	}

	public void setHref(String href) {
		this.href = href;
	}

	@Length(min = 0, max = 20)
	public String getTarget() {
		return target;
	}

	public void setTarget(String target) {
		this.target = target;
	}

	@Length(min = 0, max = 100)
	public String getIcon() {
		return icon;
	}

	public void setIcon(String icon) {
		this.icon = icon;
	}

	@Length(min = 1, max = 1)
	public String getIsShow() {
		return isShow;
	}

	public void setIsShow(String isShow) {
		this.isShow = isShow;
	}

	@Length(min = 0, max = 200)
	public String getPermission() {
		return permission;
	}

	public void setPermission(String permission) {
		this.permission = permission;
	}

//	public String getParentCode() {
//		return parent != null && parent.getId() != null ? parent.getId() : "0";
//	}
//	
//	@JsonIgnore
//	public static void sortList(List<Menu> list, List<Menu> sourcelist,
//			String parentId, boolean cascade) {
//		for (int i = 0; i < sourcelist.size(); i++) {
//			Menu e = sourcelist.get(i);
//			if (e.getParent() != null && e.getParent().getId() != null
//					&& e.getParent().getId().equals(parentId)) {
//				list.add(e);
//				if (cascade) {
//					// 判断是否还有子节点, 有则继续获取子节点
//					for (int j = 0; j < sourcelist.size(); j++) {
//						Menu child = sourcelist.get(j);
//						if (child.getParent() != null
//								&& child.getParent().getId() != null
//								&& child.getParent().getId().equals(e.getId())) {
//							sortList(list, sourcelist, e.getId(), true);
//							break;
//						}
//					}
//				}
//			}
//		}
//	}
//
//	@JsonIgnore
//	public static String getRootId() {
//		return "1";
//	}

	@Length(min = 1, max = 64, message = "归属模块长度不能超过 64 个字符")
	public String getModuleCode() {
		return moduleCode;
	}

	public void setModuleCode(String moduleCode) {
		this.moduleCode = moduleCode;
	}

	@Length(min = 1, max = 1, message = "类型（1菜单；2权限）长度不能超过 1 个字符")
	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	@Length(min = 0, max = 50, message = "颜色长度不能超过 50 个字符")
	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}
	
	/**
	 * 获取经过处理的菜单URL地址，格式：
	 * 	1、以  /// 开头，则代表是网站根路径（http://localhost/${href}）
	 *  2、以  // 开头，则代表是工程根路径（http://localhost/${ctx}/${href}）
	 *  3、以  / 开头，则代表是管理根路径（http://localhost/${ctx}${adminPath}/${href}）
	 * 可带变量，变量格式  {变量名}：
	 * 	1、app.properties中的key可作为变量设置
	 *  2、{ssoToken} : 单点登录的token编码，url参数中的参数分隔符请使用“%26”进行转义，
	 *  		例如：{projectUrl}/sso/{ssoToken}?url=/sys/user/list?p1=v1%26p2=v2&relogin=true
	 *  3、{userCode} : 当前用户编码 
	 *  4、{userName} : 当前用户名称 
	 *  5、{userType} : 当前用户类型 
	 */
	public String getUrl(){
		String href = getHref();
		if (StringUtils.isBlank(href)){
			return StringUtils.EMPTY;
		}
		// 规则变量引擎替换
		String[] keys = StringUtils.substringsBetween(getHref(), "{", "}");
		if (keys != null){
			for (String key : keys){
				if ("ssoToken".equals(key)){
					String userCode = UserUtils.getUser().getUserCode();
					// sso密钥+用户名+日期，进行md5加密，如： Digests.md5(secretKey+username+20150101)）
					String secretKey = Global.getConfig("shiro.sso.secretKey");
					String password = Digests.md5(secretKey + userCode + DateUtils.getDate("yyyyMMdd"));
					href = StringUtils.replace(href, "{"+key+"}", userCode + "/" + password);
				}else if ("userCode".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getCurrentUser().getUserCode());
				}else if ("userName".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getCurrentUser().getUserName());
				}else if ("userType".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getCurrentUser().getUserType());
				}else if ("officeCode".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getCurrentUser().getEmployee().getOfficeCode());
				}else if ("officeName".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getCurrentUser().getEmployee().getOfficeName());
				}else if ("menuCode".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getMenuCode());
				}else if ("menuParentCode".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getParentCode());
				}else if ("menuParentCodes".equals(key)){
					href = StringUtils.replace(href, "{"+key+"}", this.getParentCodes());
				}else{
					href = StringUtils.replace(href, "{"+key+"}", Global.getConfig(key));
				}
			}
		}
		// 如果是以  /// 开头，则代表是网站根路径（http://localhost/${href}）
		if (StringUtils.startsWith(href, "///")){
			return StringUtils.substring(href, 2);
		}
		// 如果是以  // 开头，则代表是工程根路径（http://localhost/${ctx}/${href}）
		if (StringUtils.startsWith(href, "//")){
			return Servlets.getRequest().getContextPath() + StringUtils.substring(href, 1);
		}
		// 如果是以  / 开头，则代表是管理根路径（http://localhost/${ctx}${adminPath}/${href}）
		if (StringUtils.startsWith(href, "/")){
			return Servlets.getRequest().getContextPath() + Global.getAdminPath() + href;
		}
		return href;
	}

	/**
	 * 截取30个字符的href
	 * @return
	 */
	public String getHrefAbbr(){
		return StringUtils.abbr(getHref(), 30);
	}

	/**
	 * 截取30个字符的permission
	 * @return
	 */
	public String getPermissionAbbr(){
		return StringUtils.abbr(getPermission(), 30);
	}

	public List<String> getModuleCodeList(){
		if (moduleCode == null){
			return Lists.newArrayList();
		}
		return Lists.newArrayList(StringUtils.split(moduleCode, ","));
	}
	
	public void setModuleCodeList(List<String> list){
		if (list == null){
			moduleCode = "";
		}
		moduleCode = StringUtils.join(list, ",");
	}

	public String getRoleCode() {
		return roleCode;
	}

	public void setRoleCode(String roleCode) {
		this.roleCode = roleCode;
	}
	
	public String getUserCode() {
		return userCode;
	}

	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}

	/**
	 * 是否是菜单
	 * @return
	 */
	public Boolean getIsMenu(){
		return TYPE_DEVMENU.equals(type) || TYPE_MENU.equals(type);
	}
	
	/**
	 * 是否是权限
	 * @return
	 */
	public Boolean getIsPerm(){
		return TYPE_PERM.equals(type);
	}

	@Override
	public String toString() {
		return menuCode;
	}
	
}